import re
import os

from pydantic import BaseModel, field_validator
from dotenv import load_dotenv  # pip install python-dotenv
# from typing_extensions import Optional  # python3.13 以后 导入
from typing import Optional


class Address(BaseModel):
    """
    地址模型类。

    维护地址的以下属性：
    - country: 国家。
    - province: 省份。
    - city: 城市。
    - street: 街道。
    - postal_code: 邮政编码。

    该类继承自 BaseModel，表示它是一个 Pydantic 模型。
    """
    country: str
    province: str
    city: str
    street: str
    postal_code: str

    class Config:
        # 启用 from_attributes，允许 Pydantic 直接从 ORM 模型中读取数据。
        from_attributes = True


class User(BaseModel):
    """
    用户模型类。

    维护用户的以下属性：
    - id: 序号。
    - name: 姓名。
    - email: 邮箱。
    - age: 年龄。
    - sex: 性别。
    - address: 地址。

    该类继承自 BaseModel，表示它是一个 Pydantic 模型。
    """
    id: int
    name: str
    email: str
    age: int
    sex: str
    address: Address
    age: Optional[int] = None  # age 是可选的
    sex: Optional[str] = None  # sex 是可选的

    @field_validator('email')
    def check_email(cls, v):
        """
        自定义验证器，用于检查邮箱地址是否有效。
        """
        email_regex = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'

        # 使用正则表达式进行匹配
        if not re.match(email_regex, v):
            raise ValueError('邮箱无效')
        return v

    class Config:
        from_attributes = True


address = Address(country='中国', province='北京', city='北京', street='第一街道', postal_code='100000')
user1 = User(id=1, name='丁小天', email='john.doe@example.com', age=28, sex='男', address=address)
user2 = User(id=2, name='刘亦菲', email='fei.doe@example.com', address=address)

user1_dict = user1.model_dump()
# print(user1.model_dump())
new_user1 = User(**user1_dict)
print(new_user1)


class Settings(BaseModel):
    """
    应用程序设置类。

    从 .env 文件中加载环境变量。

    .env 文件内容
    DATABASE_URL=postgresql://user:password@localhost:5432/mydatabase
    API_KEY=your_api_key_here
    """
    database_url: str
    api_key: str

    class Config:
        env_file = '.env'
        env_file_encoding = 'utf-8'


# 手动加载 .env 文件
load_dotenv()

# 使用 os.environ 获取环境变量
settings = Settings(
    database_url=os.getenv('DATABASE_URL'),
    api_key=os.getenv('API_KEY')
)

print(settings.database_url)
print(settings.api_key)
